<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>new一个构造函数发生了什么</title>
</head>

<body>
  <script>
    // 先声明一个示例构造函数
    function Dog(name, color) {
      this.name = name
      this.color = color
    }
    Dog.prototype.run = function () {
      console.log(this.name + '正在奔跑')
    }
    // 构造函数定义好了，下面开始制作一个简易的自己的new关键字 ===>  _new
    function _new(fn, ...args) { // 参数1： 构造函数名字   参数2： 构造函数中规定的参数（属性）
      //生成一个新对象
      let obj = {}

      // 将新对象的__proto__ 指向构造函数 的prototype 以此形成obj与构造函数的关联
      // obj.__proto__ = fn.prototype
      Object.setPrototypeOf(obj, fn.prototype)

      // 执行构造函数中的内容，并将this指向给新对象obj

      fn.call(obj, ...args)


      // 返回这个新对象
      return obj
    }


    // 实验一下能否正常构造一个对象出来



    let m = _new(Dog, 'laoli', 'green')
    console.log(m.name, m.color);  // laoli  green
    m.run()  // laoli正在奔跑   正常执行了

    let n = new Dog('laoli', 'green')
    console.log(n.name, n.color);  // laoli  green
    n.run()  // laoli正在奔跑   正常执行了

  </script>
</body>

</html>
